#include<bits/stdc++.h>
using namespace std;
#define MM 1000005
#define Mm 100005
vector<int>ans[MM];
vector<int>fia;
int maxn;
int T;
int n,m,L,V;
bool bbs[MM];
int carnum;
int tt[Mm];
int d[Mm],v[Mm],a[Mm];

void finalans(int nx){
    if(nx==n){
        int cot=0;

        for(int i=0;i<fia.size();i++){
            if(bbs[fia[i]]==0){
                bbs[fia[i]]=1;
                cot++;
            }
        }
        maxn=max(n-cot,maxn);
        for(int i=0;i<fia.size();i++){
            bbs[fia[i]]=0;
        }
        return;
    }
    if(ans[nx].size()!=0){
        for(int i=0;i<ans[nx].size();i++){
            fia.push_back(ans[nx][i]);
            finalans(nx+1);
            fia.pop_back();
        }
    }else{
        finalans(nx+1);
    }
    return;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    for(int i=0;i<T;i++){
        scanf("%d%d%d%d",&n,&m,&L,&V);

        for(int j=0;j<n;j++){
            scanf("%d%d%d",&d[j],&v[j],&a[j]);

        }
        for(int j=0;j<m;j++){
            scanf("%d",&tt[j]);

        }
        for(int j=0;j<n;j++){
            if(a[j]==0||(a[j]>0&&v[j]>V)){
                if(v[j]>V){
                    for(int l=0;l<m;l++){
                        if(tt[l]>=d[j]){
                            carnum++;
                            for(int k=l;k<m;k++){
                                ans[j].push_back(tt[k]);
                            }

                            break;
                        }
                    }
                }
            }else{
                int x;
                if(a[j]>0){
                    for(int k=0;k<m;k++){
                        if(tt[k]>=d[j]){
                            x=tt[k]-d[j];
                            float v1=sqrt(2*a[j]*x+v[j]*v[j]);
                            if(v1>V){
                                for(int l=k;l<m;l++){
                                    ans[j].push_back(tt[l]);
                                }
                                carnum++;

                                break;
                            }
                        }
                    }
                }else{
                    if(v[j]>V){

                        for(int k=0;k<m;k++){
                            if(tt[k]>=d[j]){
                                carnum++;

                                for(int s=k;s<m;s++){
                                    x=tt[s]-d[j];
                                    float v1;
                                    if((2*a[j]*x+v[j]*v[j])<=0){
                                        if(s==k){
                                            carnum--;

                                            break;
                                        }
                                        v1=0;
                                    }else{
                                        v1=sqrt(2*a[j]*x+v[j]*v[j]);

                                    }

                                    if(v1<=V){
                                        for(int l=k;l<s;l++){
                                            ans[j].push_back(tt[l]);
                                        }
                                        break;
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
        finalans(0);

        for(int j=0;j<n;j++){
            d[j]=0;v[j]=0;a[j]=0;
        }
        for(int j=0;j<n;j++){
            ans[j].empty();
        }
        for(int j=0;j<m;j++){
            tt[j]=0;
        }
        cout << carnum << ' ' << maxn;
        maxn=0;
        carnum=0;
        fia.empty();
    }
    return 0;
}

